package QianFeng06.StringDemo;

/**String类
 * 1、String可以表示一个字符串，内部使用字符数组实现，不能被继承（最终类），不可变
 * 2、String类实际是使用字符数组存储的。
 **/
public class StringDemo {
    public static void main(String[] args) {
        /*String 的两种赋值方式*/
        //1.直接赋值
        String s1 = "大神";
        //2.使用new关键字创建对象
        //面试题 问一下代码创建了几个对象？ 两个
        String s2 = new String("大神");

        String s3 = "大神";//直接使用s1的值，节省空间

        System.out.println(s1 == s2);//内存地址不同，返回false
        System.out.println(s1 == s3);//都指向同一个对象，占用同一个地址空间

        /*代码示例：4种情况分析*/
        //直接赋值字符串连接时，考虑编译期和运行期
        //如果在编译期值可以确认，那么就使用已有的对象，否则会创建新的对象
        //1.第一种情况
        String a = "a";
        String a1 = a + 1;
        String a2 = "a1";
        System.out.println(a1 == a2);//false
        //2.第二种情况
        final String b = "b";
        String b1 = b + "1";
        String b2 = "b1";
        System.out.println(b1 == b2);//true

        String c = getC();
        String c1 = c + 1;
        String c2 = "c1";
        System.out.println(c1 == c2);//false

        final String d = getD();
        String d1 = d + 1;
        String d2 = "d1";
        System.out.println(d1 == d2);//false
    }

    private static String getC() {
        return "c";
    }
    private static String getD() {
        return "c";
    }
}
